package org.excample.interceptors;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.excample.utils.JwtUtil;
import org.excample.utils.ThreadLocalUtil;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Map;

@Component//当一个类不属于任何层时(如：控制层、业务层、数据持久层)，使用该注解实现spring管理
public class LoginInterceptors implements HandlerInterceptor {//当一个类实现HandlerInterceptor(处理器拦截器)接口时，该类被称为拦截器类
   //preHandle拦截器的处理方法，
    //参数1：请求对象会携带请求信息(头协议、体协议)
    //参数2：响应对象会携带响应数据(响应状态码)
    //参数3：处理器对象，包含的处理过程
   @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //拦截请求信息验证token
        String token = request.getHeader("Authorization");//从请求的头协议中获取token值
        try{//异常处理，如果解析token时出现异常则处理异常
            Map<String,Object> claims = JwtUtil.parseToken(token);//解析token
            //把用户的业务数据存放到线程池中，由于线程池中每一个线程是独立的，因此不会发生数据混淆的问题
            ThreadLocalUtil.set(claims);
            return true;//放行，访问控制器
        }catch (Exception e){
            response.setStatus(401);//触发异常则设置响应的状态码
            return false;//不放行
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //清除线程中的数据
        ThreadLocalUtil.remove();
    }
}
